package Soligee.decorador;

//classe que efetua a paginacao em intervalos de cinco em cinco para as tabelas


import Soligee.controller.facade.sessionFacadeImplements.SessionFacadeBuscarImplements;
import java.util.List;


public class PaginacaoCincoEmCinco {

    private int numeroDaPagina = 1; //numero da pagina
    private int firstResult = 0; //indice inicial do intervalo busca
    private int maxResult = 5; //numero maximo de resultados por pagina
    private int totalPaginas =0 ;//total de paginas
    private String ordenarPor; //criterio de ordenacao da busca
    private int controle=0; //controle se a busca tem um criterio ou não (clausuala where)
    private String criterioBusca; //qual o criterio da busca (por codigo?, por nome?)
    private String valor; // valor a clausula where (Select y from tabelaX = where y = valor)
    private Class classe; //classe em que a busca está sendo realizada


    //construtor sem parâmetros
    public PaginacaoCincoEmCinco(Class classe){
        this.setFirstResult(0); //seta o primeiro first result para 0
        this.setMaxResult(5); //set o primeiro max result para 10
        this.setNumeroDaPagina(1);//seta como pagina inicial a numero
        this.setControle(0); //seta o controle
        this.setClasse(classe); //seta a classe

    }

    //construtor com parâmetros para ordenacao
    public PaginacaoCincoEmCinco(List lista, String ordenarPor,Class classe){
        this.setFirstResult(0); //seta o primeiro first result para 0
        this.setMaxResult(5); //set o primeiro max result para 10
        this.setNumeroDaPagina(1);//seta como pagina inicial a numero
        this.setTotalPaginas(this.calculaTotalPaginas(lista));//seta o total de paginas
        this.setOrdenarPor(ordenarPor); //seta a ordenacao
        this.setControle(0); //seta o controle
        this.setClasse(classe); //seta a classe
     
    }

    //construtor com parâmetros para busca criteriosa
    public PaginacaoCincoEmCinco(List lista, String ordenarPor, String criterioBusca, String valor,Class classe){
        this.setFirstResult(0); //seta o primeiro first result para 0
        this.setMaxResult(5); //set o primeiro max result para 10
        this.setNumeroDaPagina(1);//seta como pagina inicial a numero
        this.setTotalPaginas(this.calculaTotalPaginas(lista));//seta o total de paginas
        this.setOrdenarPor(ordenarPor); //seta a ordenacao
        this.setControle(1); //seta o controle
        this.setCriterioBusca(criterioBusca); // seta o criterio da busca
        this.setValor(valor); //seta o valor da busca
        this.setClasse(classe); //seta a classe para  a busca
    }

   //metodo que calcula o total de paginas para a paginacao
   public int calculaTotalPaginas(List lista){
         if((lista.size() % 5)!= 0){
             return (lista.size()/5)+1;
        }else
          return (lista.size()/5);
    }//fim calcula total paginas


    //pagina para a primeira pagina
   public List firstPage() {
        this.setNumeroDaPagina(1);
        this.setFirstResult(0);
        this.setMaxResult(5);
        return efetuaBusca();
    }//fim firstpage

   //pagina para a pagina anterior
    public List previousPage() {
         int auxiliar = (this.getNumeroDaPagina() - 1);
         if(auxiliar == 0){
             return null;
         }else{
             if(auxiliar==1){
                 return this.firstPage();
             }else{
                this.setNumeroDaPagina(auxiliar);
                this.setFirstResult(5*(this.getNumeroDaPagina()-1));
                this.setMaxResult((5*this.getNumeroDaPagina())-1);
                return efetuaBusca();
             }
         }//fim else
    }//fim metodo

    //pagina para a pagina seguinte
    public List nextPage() {
        this.setNumeroDaPagina(this.getNumeroDaPagina()+1);
        this.setFirstResult(5*(this.getNumeroDaPagina()-1));
        this.setMaxResult((5*this.getNumeroDaPagina())-1);
        return efetuaBusca();
    }

    //pagina para a ultima pagina
    public List lastPage() {
        this.setNumeroDaPagina(this.getTotalPaginas());
        this.setFirstResult(5*(this.getNumeroDaPagina()-1));
        this.setMaxResult((5*this.getNumeroDaPagina())-1);
        return efetuaBusca();

    }

    //metodo que efetua a busca em intervalos de acordo com o controle e retorna o resultado
    private List efetuaBusca(){
         SessionFacadeBuscarImplements sessionBusca = new SessionFacadeBuscarImplements();
         if(getControle()==0){
              return sessionBusca.buscaComPaginacao(this.getFirstResult(),this.getMaxResult(),this.getOrdenarPor(),this.getClasse());
         }else{
            return sessionBusca.buscaComPaginacaoComCriterio(this.getFirstResult(),this.getMaxResult(),this.getOrdenarPor(),this.getCriterioBusca(),this.getValor(),this.getClasse());
         }
    }

    //gets e sets
    public int getNumeroDaPagina() {
        return numeroDaPagina;
    }   
    public void setNumeroDaPagina(int numeroDaPagina) {
        this.numeroDaPagina = numeroDaPagina;
    }
    private int getFirstResult() {
        return firstResult;
    }   
    private void setFirstResult(int firstResult) {
        this.firstResult = firstResult;
    }
    private int getMaxResult() {
        return maxResult;
    }
    private void setMaxResult(int maxResult) {
        this.maxResult = maxResult;
    }
    public int getTotalPaginas() {
        return totalPaginas;
    }  
    public void setTotalPaginas(int totalPaginas) {
        this.totalPaginas = totalPaginas;
    }
    public String getOrdenarPor() {
        return ordenarPor;
    }
    public void setOrdenarPor(String ordenarPor) {
        this.ordenarPor = ordenarPor;
    }   
    private int getControle() {
        return controle;
    }
    private void setControle(int controle) {
        this.controle = controle;
    }
    private String getCriterioBusca() {
        return criterioBusca;
    }  
    private void setCriterioBusca(String criterioBusca) {
        this.criterioBusca = criterioBusca;
    }
    private String getValor() {
        return valor;
    }    
    private void setValor(String valor) {
        this.valor = valor;
    }    
    private Class getClasse() {
        return classe;
    }    
    private void setClasse(Class classe) {
        this.classe = classe;
    }
}
